package main

import "fmt"

/*
 亲密字符串
给定两个由小写字母构成的字符串 A 和 B
只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果，
就返回 true ；否则返回 false
交换字母的定义是取两个下标 i 和 j （下标从 0 开始），
只要 i!=j 就交换 A[i] 和 A[j] 处的字符。例如，
在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad"
示例 1：
输入： A = "ab", B = "ba"
输出： true
解释： 你可以交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba"，此时 A 和 B 相等。
示例 2：
输入： A = "ab", B = "ab"
输出： false
解释： 你只能交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba"，此时 A 和 B 不相等。
*/

// 超出时间限制
//func buddyStrings(A string, B string) bool {
//	// 把A字符串转化成byte类型
//	byteA := []byte(A)
//	for i := 0; i < len(byteA); i++ {
//		for j := i + 1;j < len(byteA);j++{
//			// 交换
//			byteA[i], byteA[j] = byteA[j], byteA[i]
//			fmt.Println(string(byteA))
//			if string(byteA) == B {
//				return true
//			}
//			// 判断完成后再交换回去
//			byteA[i], byteA[j] = byteA[j], byteA[i]
//		}
//	}
//	return false
//}

func buddyStrings(A string, B string) bool {
	la, lb := len(A), len(B)
	if la != lb {
		return false
	}
	// 字符串完全一样的情况下，找到两个一样的字母就好了
	if A == B {
		m := make(map[uint8]int)
		for i := 0; i < la; i ++ {
			m[A[i]]++
		}
		for _, v := range m {
			if v > 1 {
				return true
			}
		}
		return false
	}
	// 字符串不一样的情况下，找到两个不相等的下标
	first, second := -1, -1
	for i := 0; i < la; i++ {
		if A[i] == B[i] {
			continue
		}
		if first == -1 {
			first = i
		} else if second == -1 {
			second = i
		} else {
			return false
		}
	}
	return second != -1 && A[first] == B[second] && A[second] == B[first]
}


func main() {
	str := "hello你好"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%v(%c)  ", str[i], str[i])
	}
	fmt.Println()
	for _, v := range str {
		fmt.Printf("%v(%c)  ", v, v)
	}
	fmt.Println(buddyStrings("aaaaaaabc", "aaaaaaacb"))
}
